<?php

// demo订单控制器

namespace app\demo\controller;

use think\facade\Cache;
use think\Controller;
use think\Db;
use app\api\model\PaymentOtherOrder;

class Company extends Controller
{

    public function index()
    {
        $all_merchant = db('payment_merchant_config')->where(['status' => 1])->select();
        $this->assign('all_merchant', $all_merchant);

        $payment_type = pay_config('payment_type');
        $this->assign('payment_type', $payment_type);
        return $this->fetch();
    }

    /**
     * 创建订单接口:只允许创建付款订单
     */
    public function create()
    {

        $rule = [
            'cash' => 'require|float|length:1,10',
            'token' => 'require',
            'company' => 'require',
            'type' => 'require|length:1,20',
        ];

        $data = $this->request->param();

        $result = $this->validate($this->request->param(), $rule);
        if (true !== $result) {
            // 验证失败 输出错误信息
            return $this->error($result);
        }

        if (session('__token__') != $this->request->param('token') || session('__token__') == '') {
            return $this->error('token错误');
        }

        $find_company = Db::name('payment_pay_company')->where(['name' => $data['company']])->find();
        if (!$find_company) {
            return $this->error('公司编号不存在');
        }

        // redis连接缓存驱动
        $redis = Cache::store('redis');

        // 总支付公司名称
        $payment_company = strstr($data['company'], '_', true);
        // 总支付公司名称配置
        $payment_company_config = $redis->get($payment_company);
        // 判断总支付公司，状态是否开启、是否提供支付类型
        if (!$payment_company_config || $payment_company_config['status'] != 1 || !in_array($data['type'], $payment_company_config['value']['supply_payment_type'])) {
            return $this->error('公司禁用或者支付类型此公司不提供');
        }

        // 支付公司中的子商户号配置状态
        $children_company_config = $redis->get($data['company']);
        if (!$children_company_config || $children_company_config['status'] != 1) {
            return $this->error('公司禁用');
        }

        // 合并支付公司默认商户号和子商户号配置
        $company_merge_values = array_merge($payment_company_config['value'], $children_company_config['value']);

        $order_id = date('ymdHis') . random(8);                            // 平台订单号

        $data['version'] = '1.0';                                          // 版本号
        $data['merchant_id'] = 87654321;                                   // 商户号
        $data['merchant_order_id'] = $order_id;                            // 商户订单号
        $data['app_id'] = 0;                                               // 应用id
        $data['cash'] = $this->request->param('cash');                     // 金额（元） 
        $data['type'] = $this->request->param('type');                     // 支付类型 wechat_h5 alipay_h5 wangyin alipay_scan_code wechat_scan_code
        $data['trade_type'] = 'consumption';                               // 交易类型
        $data['body'] = '商品名称';                                         // 商品名称
        $data['name'] = '0';                                               // 姓名
        $data['id_card'] = '0';                                            // 身份证号
        $data['mobile'] = '0';                                             // 手机号
        $data['start_time'] = time();                                      // 订单开始时间:时间戳
        $data['return_url'] = 'https://www.baidu.com';                     // 支付成功服务器返回地址
        $data['notify_url'] = request()->domain() . '/success.html';       // 支付成功页面通知地址
        $data['ip'] = request()->ip();                                     // IP地址
        $data['user_id'] = 0;                                              // 用户ID
        $data['channel_id'] = 0;                                           // 渠道ID
        $data['format'] = 'json';                                          // 返回格式
        $data['sign_type'] = 'md5';                                        // 签名类型
        $data['business_type'] = 'B2C';                                    // 业务类型
        $data['bank_code'] = 'ICBC';                                       // 银行编号
        $data['extra'] = '';                                               // 商户自定义备注（原值返回）
        $data['random_string'] = date('YmdHis') . rand(100000, 999999);    // 随机字符串

        $key = db('payment_merchant_config')->where(['id' => $data['merchant_id']])->value('key');
        $data['sign'] = md5('merchant_id=' . $data['merchant_id'] . '&merchant_order_id=' . $data['merchant_order_id'] . '&cash=' . $data['cash'] . '&type=' . $data['type'] . '&return_url=' . $data['return_url'] . '&notify_url=' . $data['notify_url'] . '&ip=' . $data['ip'] . '&start_time=' . $data['start_time'] . '&random_string=' . $data['random_string'] . '&key=' . $key);

        // 商户发送参数
        $merchant_order_create_param = [
            'version' => $data['version'], // 版本号
            'merchant_id' => $data['merchant_id'], // 商户号
            'merchant_order_id' => $data['merchant_order_id'], // 商户订单号
            'app_id' => $data['app_id'], // 应用id
            'cash' => $data['cash'], // 充值金额（元）
            'type' => $data['type'], // 支付类型，支付宝或微信等等
            'trade_type' => $data['trade_type'], // 交易类型：比如充值、代付
            'body' => $data['body'], // 商品名称
            'return_url' => $data['return_url'], // 支付完成调转地址
            'notify_url' => $data['notify_url'], // 支付成功服务端通知地址
            'ip' => $data['ip'], // 客户端ip
            'user_id' => 0, // 用户id
            'vip' => 0, // vip充值
            'business_type' => isset($data['business_type']) ? $data['business_type'] : '', // 业务类型
            'bank_code' => isset($data['bank_code']) ? $data['bank_code'] : '', // 银行编号
            'format' => $data['format'], // 返回格式
            'sign_type' => $data['sign_type'], // 签名类型
            'extra' => isset($data['extra']) ? $data['extra'] : '', // 商户自定义备注
            'start_time' => $data['start_time'], // 创建时间（时间戳）
            'random_string' => $data['random_string'], // 随机字符串
            'sign' => $data['sign'], // 签名
            'key' => $key, // 密钥
            'request_ip' => request()->ip(), // 访问请求ip地址
        ];

        // 平台订单表数据
        $local_order_param = [
            'order_id' => $order_id, // 平台订单号
            'merchant_id' => $data['merchant_id'], // 商户号
            'merchant_order_id' => $data['merchant_order_id'], // 商户订单号
            'app_id' => $data['app_id'], // 应用id
            'cash' => intval(strval($data['cash'] * 100)), // 充值现金
            'now_cash' => 0, // 实际金额
            'type' => $data['type'], // 支付类型，支付宝或微信等等
            'trade_type' => $data['trade_type'], // 交易类型：比如充值、代付
            'user_id' => 0, // 用户id
            'create_time' => time(), // 订单创建时间
            'update_time' => time(), // 订单更新时间
            'company' => $payment_company, // 支付公司名称
            'child_company' => $data['company'], // 支付公司子商户号名称
            'status' => 1, // 状态
            'other_order_id' => '', // 第三方订单号
            'create_param' => json_encode($merchant_order_create_param, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), // 创建商户号发送参数数据
        ];

        db('payment_order')->insert($local_order_param);

        // 发送给第三方支付公司参数
        $param['order_id'] = $order_id;                                   // 平台订单号
        $param['type'] = $data['type'];                                   // 支付类型
        $param['cash'] = $data['cash'];                                   // 支付金额
        $param['body'] = $order_id;                                       // 商品名称
        $param['ip'] = request()->ip();                                   // 客户端ip
        $param['return_url'] = request()->domain() . '/success.html';     // 支付完成跳转界面
        $param['user_id'] = 0;                                            // 用户id
        $param['tj_return_url'] = request()->domain() . '/success.html';  // 支付完成跳转界面
        // 实例化第三方订单模型
        $other_order_obj = new PaymentOtherOrder();
        $resarray = $other_order_obj->$payment_company($param, $company_merge_values);
        if ($resarray['code'] == 200) {
            Db::name('payment_order')->where(['order_id' => $order_id])->update(['verify_param' => $resarray['verify_param']]);
            header("Location: {$resarray['url']}");
            exit;
        } else {
            $msg = isset($resarray['return_param']) ? $resarray['return_param'] : '未知错误';
            return $this->error('错误说明：' . $msg);
        }
    }
}
